// cf-528-c
// 题意：给定n(<=100000)个点，m(<=200000)条无向边，初始图连通，现在要加最
//       少的边，使得给每条边确定方向后，每个点的出度和入度都为偶数。
//       问最少加几条边以及确定方向的一种方案。可以有重边和自环。
//
// 题解：不错的图论题，其实就是找欧拉回路。先将原来的无向图的奇数度数的点
//       连边使得满足欧拉回路的条件。然后对于一个回路比如
//         a -> b -> c -> d -> a
//       相邻边方向交替就可以满足所有点入度和出度都为偶数，即：
//         a -> b <- c -> d <- a
//       无向图中如果所有边总数是奇数还得再随便加一条自环例如 a->a，
//       再求欧拉回路。
//
//       然后求欧拉回路的时候要删边。每次更新head的值就可以保证边不会重复
//       访问。
//
// run: time -p $exec < input > output
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

int const maxn = 400007;
int const maxm = 800007;
int head[maxn], end[maxm], next[maxm];
bool del[maxm];
int alloc = 2;
int degree[maxn];
int n, m;

void add_edge(int u, int v)
{
	end[alloc] = v; next[alloc] = head[u];
	head[u] = alloc++; degree[u]++;

	end[alloc] = u; next[alloc] = head[v];
	head[v] = alloc++; degree[v]++;
}

std::vector<int> euler_path;

void find_circuit(int u)
{
	// trik part int & p, every time use head[u] and update it to next
	// to ensure no edge to be visited twice
	for (int & p = head[u]; p; p = next[p]) {
		if (del[p]) continue;
		int v = end[p];
		del[p] = del[p ^ 1] = true;
		find_circuit(v);
	}
	euler_path.push_back(u);
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> m;
	for (int i = 0, x, y; i < m; i++) {
		std::cin >> x >> y;
		add_edge(x, y);
	}
	int last = -1;
	for (int i = 1; i <= n; i++) {
		if (!(degree[i] & 1)) continue;
		if (last == -1) last = i;
		else { add_edge(i, last); last = -1; m++; }
	}
	if (m & 1) add_edge(1, 1);

	find_circuit(1);

	n = euler_path.size();
	std::cout << n - 1 << '\n';
	for (int i = 1; i < n; i += 2) {
		std::cout << euler_path[i - 1] << ' ' << euler_path[i] << '\n';
		std::cout << euler_path[i + 1] << ' ' << euler_path[i] << '\n';
	}
}

